package com.company.UI;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ClientChatUI extends JFrame {
    private Socket socket; // 登录成功后保存当前 Socket，以便在聊天窗口继续使用，负责与服务端进行交互
    public JList<String> userList = new JList<>(); // 在线用户列表
    private JTextArea chatArea = new JTextArea(); // 聊天记录

    // 统一线程的静态引用，便于其他地方获取
    private static ClientThread clientThread;

    public ClientChatUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        init();
        setVisible(true);
    }
    public ClientChatUI(Socket socket, String name){
        this(); // 先调用无参构造器对界面初始化
        this.setTitle(name + " 的聊天窗口"); // 使用 name 设置窗口标题
        this.socket = socket;
        //this.name = name;

        // 创建一个线程，用于接收服务器发来的消息，并显示在聊天窗口中
        clientThread = new ClientThread(socket, this);
        clientThread.start();
    }

    // 提供静态方法获取统一线程
    public static ClientThread getClientThread() {
        return clientThread;
    }

    private void init() {
        // 1) 主面板：自定义渐变背景
        JPanel mainPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                int w = getWidth();
                int h = getHeight();
                // 从上到下的渐变，可根据喜好修改起始颜色和结束颜色
                GradientPaint gp = new GradientPaint(
                        0, 0, new Color(135, 206, 250),    // 浅蓝
                        0, h, new Color(224, 255, 255)     // 浅青
                );
                g2d.setPaint(gp);
                g2d.fillRect(0, 0, w, h);
            }
        };
        // 使用 BorderLayout 分区
        mainPanel.setLayout(new BorderLayout());
        setContentPane(mainPanel);

        // 2) 顶部区域：显示群聊名称
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 15));
        topPanel.setOpaque(false); // 让背景渐变可见
        JLabel groupNameLabel = new JLabel("工位在线聊天系统");
        groupNameLabel.setFont(new Font("微软雅黑", Font.BOLD, 20));
        groupNameLabel.setForeground(Color.WHITE); // 在浅色背景上保持可见
        topPanel.add(groupNameLabel);
        mainPanel.add(topPanel, BorderLayout.NORTH);

        // 3) 右侧在线用户列表
        userList.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        userList.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e){
                if (e.getClickCount() == 2) {
                    int index = userList.locationToIndex(e.getPoint());
                    if (index != -1) {
                        String selectedUserName = userList.getModel().getElementAt(index); // 获取选中的用户名
                        PrivateChatUI privateChatUI = new PrivateChatUI(socket, selectedUserName);
                        ClientThread thread = ClientChatUI.getClientThread();
                        if (thread != null) {
                            thread.registerPrivateChatWindow(selectedUserName, privateChatUI);
                        }
                    }
                }
            }
        });

        // 滚动面板 + 边框
        JScrollPane userScrollPane = new JScrollPane(userList);
        userScrollPane.setPreferredSize(new Dimension(200, 0));
        userScrollPane.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.GRAY, 1),
                "在线用户",
                TitledBorder.LEFT,
                TitledBorder.TOP,
                new Font("微软雅黑", Font.BOLD, 14),
                Color.DARK_GRAY
        ));
        userScrollPane.setOpaque(false);
        userScrollPane.getViewport().setOpaque(false); // 让列表背景也可透过渐变
        mainPanel.add(userScrollPane, BorderLayout.EAST);

        // 4) 中间区域：聊天信息 + 输入消息
        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.setOpaque(false);
        mainPanel.add(centerPanel, BorderLayout.CENTER);

        // 4.1) 聊天信息区域
        chatArea.setEditable(false);
        chatArea.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        // 保持白色背景，便于阅读（如想透明可 setOpaque(false)）
        chatArea.setBackground(Color.WHITE);
        // 外边距
        chatArea.setBorder(new EmptyBorder(5, 5, 5, 5));

        JScrollPane chatScrollPane = new JScrollPane(chatArea);
        chatScrollPane.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.GRAY, 1),
                "聊天记录",
                TitledBorder.LEFT,
                TitledBorder.TOP,
                new Font("微软雅黑", Font.BOLD, 14),
                Color.DARK_GRAY
        ));
        // 聊天区域同样可选择透明
        chatScrollPane.setOpaque(false);
        chatScrollPane.getViewport().setOpaque(true); // 保持文本区域为白底
        centerPanel.add(chatScrollPane, BorderLayout.CENTER);

        // 4.2) 底部输入区
        JPanel inputPanel = new JPanel(new BorderLayout());
        inputPanel.setPreferredSize(new Dimension(0, 120));
        inputPanel.setOpaque(false);
        // 给输入区加一个标题边框
        inputPanel.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.GRAY, 1),
                "输入消息",
                TitledBorder.LEFT,
                TitledBorder.TOP,
                new Font("微软雅黑", Font.BOLD, 14),
                Color.DARK_GRAY
        ));

        // 多行输入框
        JTextArea inputArea = new JTextArea();
        inputArea.setLineWrap(true);
        inputArea.setWrapStyleWord(true);
        inputArea.setMargin(new Insets(5, 5, 5, 5));
        inputArea.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        inputArea.setBackground(Color.WHITE);
        JScrollPane scrollPane = new JScrollPane(inputArea);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        // 保持输入区为白底
        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(true);

        inputPanel.add(scrollPane, BorderLayout.CENTER);

        // 发送按钮
        JButton sendButton = new JButton("发送");
        sendButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        sendButton.setPreferredSize(new Dimension(80, 30));
        inputPanel.add(sendButton, BorderLayout.EAST);

        sendButton.addActionListener(e -> {
            String message = inputArea.getText().trim(); // 获取要发送的消息
            inputArea.setText(""); // 清空输入框，代表消息已经发送出去了
            if (message.isEmpty()) {
                JOptionPane.showMessageDialog(this, "请输入要发送的消息！");
                return;
            }
            try {
                DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                dos.writeInt(2); // 代表发送的是 群聊消息的请求
                dos.writeUTF(message);
                dos.flush();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });

        centerPanel.add(inputPanel, BorderLayout.SOUTH);
    }
    // 更新界面中的在线用户列表
    public void showOnlineUsersList(String[] users) {
        userList.setListData(users);
    }

    // 显示界面中的聊天信息
    public void showMessages(String message) {
        chatArea.append(message + "\n");
    }
}
